package com.assistant.command.impl;

import com.assistant.command.Command;
import com.assistant.core.CommandData;
import com.assistant.system.SystemUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.List;

/**
 * @author Anyang
 * @version 1.0.0
 * @date 2025/10/25 05:10:13
 * @description 启动应用
 */
public class OpenAppCommand implements Command {
    private static final Logger logger = LoggerFactory.getLogger(OpenAppCommand.class);

    // 引入 OpenUrlCommand 实例，用于纠错后的网址启动
    private final OpenUrlCommand urlCommand = new OpenUrlCommand();
    private static final java.util.Map<String, String> CHINESE_URL_MAP = new java.util.HashMap<>();
    static {
        // 预设最常被语音识别和NLU误识别为App的网址
        CHINESE_URL_MAP.put("百度", "baidu.com");
        CHINESE_URL_MAP.put("谷歌", "google.com");
        CHINESE_URL_MAP.put("哔哩哔哩", "bilibili.com");
        CHINESE_URL_MAP.put("知乎", "zhihu.com");
        CHINESE_URL_MAP.put("淘宝", "taobao.com");
        // 可以根据需要继续添加
    }
    // 定义常见的“网址”关键词，用于 NLU 纠错
    private static final List<String> URL_KEYWORDS = Arrays.asList("首页", "网站", "网址", "官网", "主页");

    @Override
    public boolean supports(String action) {
        return "open_app".equals(action.toLowerCase());
    }

    @Override
    public String execute(CommandData data) {
        String target = data.getTarget();
        logger.info("执行指令：打开应用 -> {}", target);

        // --- 核心纠错逻辑：处理 NLU 误识别的网址 ---
        boolean isLikelyUrl = URL_KEYWORDS.stream().anyMatch(target::contains);

        if (isLikelyUrl) {
            // 步骤 1: 从目标中去除关键词，提取出核心名称 (例如：从 '哔哩哔哩的网站' 提取 '哔哩哔哩')
            String coreTarget = target;
            for (String keyword : URL_KEYWORDS) {
                // 移除关键词
                coreTarget = coreTarget.replace(keyword, "").trim();
            }
            // 进一步移除常见的中文修饰词，例如 “的”
            coreTarget = coreTarget.replace("的", "").trim();

            // 步骤 2: 将核心名称映射为实际网址
            String finalUrl = null;

            // 优先查找映射表
            for (java.util.Map.Entry<String, String> entry : CHINESE_URL_MAP.entrySet()) {
                if (coreTarget.toLowerCase().contains(entry.getKey().toLowerCase())) {
                    finalUrl = entry.getValue();
                    break;
                }
            }

            // 如果映射表中没有，则回退到原始拼接逻辑
            if (finalUrl == null) {
                // 如果是其他网站，默认尝试用 .com 拼接
                finalUrl = coreTarget.toLowerCase() + ".com";
            }

            // 检查 coreTarget 是否有效，如果为空，则默认打开百度
            if (coreTarget.isEmpty() || coreTarget.equals(".com")) {
                finalUrl = "baidu.com";
            }


            logger.warn("【纠错】NLU将URL误识别为App。将指令 {} 纠正为 open_url: {}", target, finalUrl);

            // 步骤 3: 使用 OpenUrlCommand 执行纠正后的网址命令
            CommandData correctedData = new CommandData("open_url", finalUrl, "");
            return urlCommand.execute(correctedData); // 委托给 OpenUrlCommand
        }
        // --- 纠错逻辑结束 ---

        // 1. 调用通用的、带有窗口验证的系统启动方法
        boolean success = SystemUtil.openApplication(target);

        if (success) {
            // 现在 success 才是可靠的！
            return String.format("好的，已为您启动应用【%s】。", target);
        } else {
            // 只有当 ShellExecute 失败或窗口验证失败时才返回错误
            return String.format("抱歉，未能成功启动应用【%s】。请检查应用名称是否正确，或系统环境是否缺失此程序。", target);
        }
    }
}